import { Agent } from '@mastra/core/agent';
import { LibSQLStore } from '@mastra/libsql';
import { Memory } from '@mastra/memory';
import { createModel } from '../provider/model';
import { gameMasterTool } from '../tools/game-master.tool';

/**
 * 游戏主控Agent
 * 负责统一游戏流程控制，协调其他Agent，维护游戏状态
 */
export const gameMasterAgent = new Agent({
  name: 'GameMaster',
  description: 'The master agent that orchestrates the entire cyber detective game experience',
  instructions: `
    你是赛博侦探游戏的智能游戏主控，负责协调整个游戏体验。
    
    ## 核心职责
    1. **游戏会话管理** - 创建、维护和结束游戏会话
    2. **Agent协调** - 统一调度案件生成、对话、评估等Agent
    3. **游戏状态维护** - 实时跟踪游戏进度、玩家状态、时间管理
    4. **错误处理与恢复** - 处理异常情况，提供降级方案
    5. **用户体验优化** - 根据玩家行为调整游戏难度和节奏
    
    ## 游戏流程控制
    
    ### 游戏开始阶段
    - 接收玩家的游戏配置（难度、主题、嫌疑人数量）
    - 协调案件生成Agent创建完整案件
    - 初始化游戏状态和计时器
    - 设置玩家档案和学习记录
    
    ### 调查阶段管理
    - 监控调查进度和时间限制
    - 协调嫌疑人对话Agent处理玩家询问
    - 管理线索的逐步揭示
    - 提供智能提示和引导
    
    ### 推理评估阶段
    - 接收玩家的最终推理
    - 协调评估Agent进行综合评分
    - 生成详细的反馈和解释
    - 记录学习进度和改进建议
    
    ## 智能特性
    
    ### 自适应难度调整
    - 根据玩家表现动态调整线索难度
    - 智能提示系统，避免玩家卡关
    - 个性化的游戏节奏控制
    
    ### 学习与记忆
    - 记录玩家的推理模式和偏好
    - 学习玩家的强项和弱项
    - 提供个性化的改进建议
    
    ### 多模态交互
    - 支持文本、语音等多种交互方式
    - 智能理解玩家意图和情绪
    - 提供沉浸式的游戏体验
    
    ## 交互原则
    
    ### 自然语言理解
    - 理解玩家的自然语言指令
    - 智能解析游戏配置和偏好
    - 提供人性化的回应和引导
    
    ### 状态管理
    - 维护完整的游戏状态信息
    - 支持游戏暂停和恢复
    - 提供实时的进度反馈
    
    ### 错误处理
    - 优雅处理各种异常情况
    - 提供多级降级方案
    - 确保游戏体验的连续性
    
    ## 工具使用指南
    
    始终使用 game-master 工具来执行具体操作：
    - start_game: 开始新游戏
    - manage_session: 管理游戏会话
    - coordinate_agents: 协调其他Agent
    - update_state: 更新游戏状态
    - handle_error: 处理错误情况
    
    ## 响应格式
    
    确保所有响应都包含：
    - success: 操作是否成功
    - data: 相关游戏数据
    - gameState: 当前游戏状态
    - message: 用户友好的消息
    - nextActions: 建议的下一步操作
    
    记住：你是玩家的智能游戏伙伴，要确保每个玩家都能获得个性化、有挑战性且有趣的游戏体验！
  `,
  model: createModel(),
  tools: { gameMasterTool },
  memory: new Memory({
    storage: new LibSQLStore({
      url: 'file:../mastra.db',
    }),
  }),
});

/**
 * 游戏主控Agent的便捷调用方法
 * @param action 操作类型
 * @param params 操作参数
 * @returns 操作结果
 */
export async function callGameMaster(action: string, params: any) {
  try {
    console.log(`游戏主控Agent执行操作: ${action}`, params);
    
    // 构建智能提示词
    const prompt = `请作为游戏主控执行以下操作：${action}
    
    操作参数：${JSON.stringify(params, null, 2)}
    
    请使用 game-master 工具来处理这个请求，确保：
    1. 维护游戏状态的一致性
    2. 提供用户友好的反馈
    3. 处理可能的错误情况
    4. 协调相关的其他Agent
    
    返回完整的操作结果和游戏状态更新。`;
    
    // 调用Agent
    const response = await gameMasterAgent.streamVNext([
      {
        role: 'user',
        content: prompt,
      },
    ]);
    
    // 处理流式响应
    let textResult = '';
    for await (const chunk of response.textStream) {
      textResult += chunk;
    }
    
    console.log('游戏主控Agent响应:', textResult);
    
    // 从工具调用结果中提取数据
    const toolCalls = response.toolCalls;
    if (toolCalls && toolCalls.length > 0) {
      console.log('工具调用成功:', toolCalls[0]);
      return {
        success: true,
        ...toolCalls[0].result,
        agentResponse: textResult
      };
    }
    
    // 如果没有工具调用，返回文本响应
    return {
      success: true,
      message: textResult,
      data: null,
      gameState: null,
      agentResponse: textResult
    };
    
  } catch (error) {
    console.error('游戏主控Agent调用失败:', error);
    
    // 提供降级方案
    return {
      success: false,
      message: `游戏主控操作失败: ${error instanceof Error ? error.message : '未知错误'}`,
      error: error instanceof Error ? error.message : 'UNKNOWN_ERROR',
      fallbackData: {
        action,
        params,
        timestamp: new Date().toISOString()
      }
    };
  }
}

/**
 * 专门用于开始新游戏的便捷方法
 */
export async function startNewGameSession(config: {
  difficulty: 'easy' | 'normal' | 'hard';
  theme?: string;
  suspectCount?: number;
  playerProfile?: any;
}) {
  return await callGameMaster('start_game', {
    gameConfig: config,
    sessionId: `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
    timestamp: new Date().toISOString()
  });
}

/**
 * 专门用于管理游戏会话的便捷方法
 */
export async function manageGameSession(sessionId: string, action: string, data: any) {
  return await callGameMaster('manage_session', {
    sessionId,
    action,
    data,
    timestamp: new Date().toISOString()
  });
}

/**
 * 专门用于协调其他Agent的便捷方法
 */
export async function coordinateAgents(agentType: string, operation: string, params: any) {
  return await callGameMaster('coordinate_agents', {
    targetAgent: agentType,
    operation,
    params,
    timestamp: new Date().toISOString()
  });
}

/**
 * 专门用于更新游戏状态的便捷方法
 */
export async function updateGameState(sessionId: string, stateUpdates: any) {
  return await callGameMaster('update_state', {
    sessionId,
    updates: stateUpdates,
    timestamp: new Date().toISOString()
  });
}

/**
 * 专门用于错误处理的便捷方法
 */
export async function handleGameError(sessionId: string, error: any, context: any) {
  return await callGameMaster('handle_error', {
    sessionId,
    error: error instanceof Error ? error.message : error,
    context,
    timestamp: new Date().toISOString()
  });
}
